{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 第一阶段_第三周作业"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 第二步. 调整树的参数：max_depth & min_child_weight"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "首先 import 必要的模块"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from xgboost import XGBClassifier\n",
    "import xgboost as xgb\n",
    "\n",
    "import pandas as pd \n",
    "import numpy as np\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.model_selection import StratifiedKFold\n",
    "\n",
    "from sklearn.metrics import log_loss\n",
    "\n",
    "from matplotlib import pyplot\n",
    "import seaborn as sns\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>bathrooms</th>\n",
       "      <th>bedrooms</th>\n",
       "      <th>price</th>\n",
       "      <th>price_bathrooms</th>\n",
       "      <th>price_bedrooms</th>\n",
       "      <th>room_diff</th>\n",
       "      <th>room_num</th>\n",
       "      <th>Year</th>\n",
       "      <th>Month</th>\n",
       "      <th>Day</th>\n",
       "      <th>...</th>\n",
       "      <th>walk</th>\n",
       "      <th>walls</th>\n",
       "      <th>war</th>\n",
       "      <th>washer</th>\n",
       "      <th>water</th>\n",
       "      <th>wheelchair</th>\n",
       "      <th>wifi</th>\n",
       "      <th>windows</th>\n",
       "      <th>work</th>\n",
       "      <th>interest_level</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.5</td>\n",
       "      <td>3</td>\n",
       "      <td>3000</td>\n",
       "      <td>1200.0</td>\n",
       "      <td>750.000000</td>\n",
       "      <td>-1.5</td>\n",
       "      <td>4.5</td>\n",
       "      <td>2016</td>\n",
       "      <td>6</td>\n",
       "      <td>24</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1.0</td>\n",
       "      <td>2</td>\n",
       "      <td>5465</td>\n",
       "      <td>2732.5</td>\n",
       "      <td>1821.666667</td>\n",
       "      <td>-1.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>6</td>\n",
       "      <td>12</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "      <td>2850</td>\n",
       "      <td>1425.0</td>\n",
       "      <td>1425.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>17</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "      <td>3275</td>\n",
       "      <td>1637.5</td>\n",
       "      <td>1637.500000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>18</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1.0</td>\n",
       "      <td>4</td>\n",
       "      <td>3350</td>\n",
       "      <td>1675.0</td>\n",
       "      <td>670.000000</td>\n",
       "      <td>-3.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>28</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 228 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   bathrooms  bedrooms  price  price_bathrooms  price_bedrooms  room_diff  \\\n",
       "0        1.5         3   3000           1200.0      750.000000       -1.5   \n",
       "1        1.0         2   5465           2732.5     1821.666667       -1.0   \n",
       "2        1.0         1   2850           1425.0     1425.000000        0.0   \n",
       "3        1.0         1   3275           1637.5     1637.500000        0.0   \n",
       "4        1.0         4   3350           1675.0      670.000000       -3.0   \n",
       "\n",
       "   room_num  Year  Month  Day       ...        walk  walls  war  washer  \\\n",
       "0       4.5  2016      6   24       ...           0      0    0       0   \n",
       "1       3.0  2016      6   12       ...           0      0    0       0   \n",
       "2       2.0  2016      4   17       ...           0      0    0       0   \n",
       "3       2.0  2016      4   18       ...           0      0    0       0   \n",
       "4       5.0  2016      4   28       ...           0      0    1       0   \n",
       "\n",
       "   water  wheelchair  wifi  windows  work  interest_level  \n",
       "0      0           0     0        0     0               1  \n",
       "1      0           0     0        0     0               2  \n",
       "2      0           0     0        0     0               0  \n",
       "3      0           0     0        0     0               2  \n",
       "4      0           0     0        0     0               2  \n",
       "\n",
       "[5 rows x 228 columns]"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dpath = './data/'\n",
    "train = pd.read_csv(dpath +\"RentListingInquries_FE_train.csv\")\n",
    "train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# prepare cross validation\n",
    "kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# drop ids and get labels\n",
    "y_train = train['interest_level']\n",
    "X_train = np.array(train.drop(\"interest_level\", axis=1))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "第一轮参数调整得到的n_estimators最优值（261），其余参数继续默认值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'max_depth': [3, 5, 7, 9], 'min_child_weight': [1, 3, 5]}"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#max_depth 建议3-10， min_child_weight=1／sqrt(ratio_rare_event) =5.5\n",
    "max_depth = range(3,10,2)\n",
    "min_child_weight = range(1,6,2)\n",
    "param_test2_1 = dict(max_depth=max_depth, min_child_weight=min_child_weight)\n",
    "param_test2_1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "d:\\ProgramData\\Anaconda2\\lib\\site-packages\\sklearn\\model_selection\\_search.py:761: DeprecationWarning: The grid_scores_ attribute was deprecated in version 0.18 in favor of the more elaborate cv_results_ attribute. The grid_scores_ attribute will not be available from 0.20\n",
      "  DeprecationWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "([mean: -0.59930, std: 0.00290, params: {'max_depth': 3, 'min_child_weight': 1},\n",
       "  mean: -0.59957, std: 0.00295, params: {'max_depth': 3, 'min_child_weight': 3},\n",
       "  mean: -0.59950, std: 0.00322, params: {'max_depth': 3, 'min_child_weight': 5},\n",
       "  mean: -0.58808, std: 0.00428, params: {'max_depth': 5, 'min_child_weight': 1},\n",
       "  mean: -0.58892, std: 0.00402, params: {'max_depth': 5, 'min_child_weight': 3},\n",
       "  mean: -0.58844, std: 0.00341, params: {'max_depth': 5, 'min_child_weight': 5},\n",
       "  mean: -0.59105, std: 0.00305, params: {'max_depth': 7, 'min_child_weight': 1},\n",
       "  mean: -0.59034, std: 0.00361, params: {'max_depth': 7, 'min_child_weight': 3},\n",
       "  mean: -0.58981, std: 0.00391, params: {'max_depth': 7, 'min_child_weight': 5},\n",
       "  mean: -0.60867, std: 0.00392, params: {'max_depth': 9, 'min_child_weight': 1},\n",
       "  mean: -0.60332, std: 0.00536, params: {'max_depth': 9, 'min_child_weight': 3},\n",
       "  mean: -0.59881, std: 0.00378, params: {'max_depth': 9, 'min_child_weight': 5}],\n",
       " {'max_depth': 5, 'min_child_weight': 1},\n",
       " -0.5880773269818923)"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "xgb2_1 = XGBClassifier(\n",
    "        learning_rate =0.1,\n",
    "        n_estimators=261,  #第一轮参数调整得到的n_estimators最优值\n",
    "        max_depth=5,\n",
    "        min_child_weight=1,\n",
    "        gamma=0,\n",
    "        subsample=0.3,\n",
    "        colsample_bytree=0.8,\n",
    "        colsample_bylevel = 0.7,\n",
    "        objective= 'multi:softprob',\n",
    "        nthread=3,\n",
    "        seed=3)\n",
    "\n",
    "\n",
    "gsearch2_1 = GridSearchCV(xgb2_1, param_grid = param_test2_1, scoring='neg_log_loss',n_jobs=-1, cv=kfold)\n",
    "gsearch2_1.fit(X_train , y_train)\n",
    "\n",
    "gsearch2_1.grid_scores_, gsearch2_1.best_params_,     gsearch2_1.best_score_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "d:\\ProgramData\\Anaconda2\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "d:\\ProgramData\\Anaconda2\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split0_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "d:\\ProgramData\\Anaconda2\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split1_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "d:\\ProgramData\\Anaconda2\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split2_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "d:\\ProgramData\\Anaconda2\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split3_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "d:\\ProgramData\\Anaconda2\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split4_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "d:\\ProgramData\\Anaconda2\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "{'mean_fit_time': array([291.63519993, 264.25780001, 263.91380005, 440.11700006,\n",
       "        366.37759995, 425.84040003, 580.70800004, 575.76799998,\n",
       "        557.88499999, 714.88739991, 737.38140006, 621.43759999]),\n",
       " 'mean_score_time': array([0.70840001, 0.72999997, 0.72219996, 1.19419999, 1.11219997,\n",
       "        1.0698    , 2.01759996, 1.8402    , 1.73139997, 3.29220009,\n",
       "        2.78320003, 2.51800003]),\n",
       " 'mean_test_score': array([-0.5992951 , -0.59956804, -0.59949955, -0.58807733, -0.58891635,\n",
       "        -0.5884381 , -0.59104701, -0.59033618, -0.58981491, -0.60867287,\n",
       "        -0.60331744, -0.59880554]),\n",
       " 'mean_train_score': array([-0.57284465, -0.57402332, -0.57434364, -0.50059398, -0.50685065,\n",
       "        -0.51043252, -0.3876682 , -0.41108   , -0.42554485, -0.25744273,\n",
       "        -0.30601719, -0.33566308]),\n",
       " 'param_max_depth': masked_array(data=[3, 3, 3, 5, 5, 5, 7, 7, 7, 9, 9, 9],\n",
       "              mask=[False, False, False, False, False, False, False, False,\n",
       "                    False, False, False, False],\n",
       "        fill_value='?',\n",
       "             dtype=object),\n",
       " 'param_min_child_weight': masked_array(data=[1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5],\n",
       "              mask=[False, False, False, False, False, False, False, False,\n",
       "                    False, False, False, False],\n",
       "        fill_value='?',\n",
       "             dtype=object),\n",
       " 'params': [{'max_depth': 3, 'min_child_weight': 1},\n",
       "  {'max_depth': 3, 'min_child_weight': 3},\n",
       "  {'max_depth': 3, 'min_child_weight': 5},\n",
       "  {'max_depth': 5, 'min_child_weight': 1},\n",
       "  {'max_depth': 5, 'min_child_weight': 3},\n",
       "  {'max_depth': 5, 'min_child_weight': 5},\n",
       "  {'max_depth': 7, 'min_child_weight': 1},\n",
       "  {'max_depth': 7, 'min_child_weight': 3},\n",
       "  {'max_depth': 7, 'min_child_weight': 5},\n",
       "  {'max_depth': 9, 'min_child_weight': 1},\n",
       "  {'max_depth': 9, 'min_child_weight': 3},\n",
       "  {'max_depth': 9, 'min_child_weight': 5}],\n",
       " 'rank_test_score': array([ 8, 10,  9,  1,  3,  2,  6,  5,  4, 12, 11,  7]),\n",
       " 'split0_test_score': array([-0.59485765, -0.59491245, -0.59430814, -0.58017999, -0.58193386,\n",
       "        -0.58224232, -0.5857543 , -0.58459618, -0.58370384, -0.60257941,\n",
       "        -0.59699674, -0.59361667]),\n",
       " 'split0_train_score': array([-0.57443226, -0.57577904, -0.57579372, -0.50147423, -0.50907357,\n",
       "        -0.51283503, -0.38986869, -0.41333998, -0.42851574, -0.2587905 ,\n",
       "        -0.30711045, -0.33589708]),\n",
       " 'split1_test_score': array([-0.59857791, -0.59831125, -0.59846181, -0.58717972, -0.58684984,\n",
       "        -0.58797984, -0.59006751, -0.58935453, -0.58771276, -0.60657965,\n",
       "        -0.59798656, -0.59795355]),\n",
       " 'split1_train_score': array([-0.57337342, -0.57409637, -0.57474566, -0.50104955, -0.50755125,\n",
       "        -0.51023006, -0.38773154, -0.41115949, -0.42489843, -0.25525789,\n",
       "        -0.30536085, -0.33554374]),\n",
       " 'split2_test_score': array([-0.59870749, -0.59936697, -0.59906195, -0.58980047, -0.59159433,\n",
       "        -0.58889195, -0.59182946, -0.59257868, -0.59024188, -0.6112408 ,\n",
       "        -0.60399189, -0.59944841]),\n",
       " 'split2_train_score': array([-0.57289758, -0.57402277, -0.57380517, -0.50068318, -0.50624055,\n",
       "        -0.51042889, -0.38644405, -0.40938983, -0.42437399, -0.25659493,\n",
       "        -0.30625023, -0.3348187 ]),\n",
       " 'split3_test_score': array([-0.60375127, -0.60349489, -0.60363133, -0.59108449, -0.59161844,\n",
       "        -0.59144225, -0.59284751, -0.58974719, -0.5922342 , -0.60893484,\n",
       "        -0.6061291 , -0.59769859]),\n",
       " 'split3_train_score': array([-0.57249614, -0.57376179, -0.57434344, -0.50118384, -0.5069403 ,\n",
       "        -0.51044424, -0.38645222, -0.40998648, -0.42382857, -0.2566012 ,\n",
       "        -0.30527426, -0.33558271]),\n",
       " 'split4_test_score': array([-0.60058157, -0.60175532, -0.60203531, -0.5921432 , -0.59258637,\n",
       "        -0.59163511, -0.59473738, -0.59540588, -0.59518351, -0.61403126,\n",
       "        -0.61148539, -0.60531244]),\n",
       " 'split4_train_score': array([-0.57102387, -0.57245663, -0.57303023, -0.49857912, -0.50444755,\n",
       "        -0.50822437, -0.38784449, -0.41152424, -0.42610751, -0.25996913,\n",
       "        -0.30609016, -0.33647318]),\n",
       " 'std_fit_time': array([ 49.61746613,  18.77877668,  21.60131087,  54.89655178,\n",
       "         85.31179374,  56.62812356,  89.67164631, 105.12960606,\n",
       "        102.26730211, 157.64144294, 115.21303458, 119.27132729]),\n",
       " 'std_score_time': array([0.06188248, 0.04575145, 0.04199716, 0.25756039, 0.0291163 ,\n",
       "        0.03135221, 0.1484555 , 0.06293294, 0.07530366, 0.20484765,\n",
       "        0.21067267, 0.45282091]),\n",
       " 'std_test_score': array([0.00290052, 0.00294958, 0.00321627, 0.00428294, 0.00402414,\n",
       "        0.00340734, 0.00304774, 0.00360513, 0.00391452, 0.0039213 ,\n",
       "        0.005356  , 0.00378471]),\n",
       " 'std_train_score': array([0.0011171 , 0.00105932, 0.00092513, 0.00103903, 0.00152232,\n",
       "        0.00146213, 0.00125335, 0.00136848, 0.00166596, 0.00169704,\n",
       "        0.00066896, 0.00053753])}"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gsearch2_1.cv_results_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Best: -0.588077 using {'max_depth': 5, 'min_child_weight': 1}\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0xff377b8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# summarize results\n",
    "print(\"Best: %f using %s\" % (gsearch2_1.best_score_, gsearch2_1.best_params_))\n",
    "test_means = gsearch2_1.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = gsearch2_1.cv_results_[ 'std_test_score' ]\n",
    "train_means = gsearch2_1.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = gsearch2_1.cv_results_[ 'std_train_score' ]\n",
    "\n",
    "pd.DataFrame(gsearch2_1.cv_results_).to_csv('my_preds_maxdepth_min_child_weights_1.csv')\n",
    "\n",
    "# plot results\n",
    "test_scores = np.array(test_means).reshape(len(max_depth), len(min_child_weight))\n",
    "train_scores = np.array(train_means).reshape(len(max_depth), len(min_child_weight))\n",
    "\n",
    "for i, value in enumerate(max_depth):\n",
    "    pyplot.plot(min_child_weight, -test_scores[i], label= 'test_max_depth:'   + str(value))\n",
    "#for i, value in enumerate(min_child_weight):\n",
    "#    pyplot.plot(max_depth, train_scores[i], label= 'train_min_child_weight:'   + str(value))\n",
    "    \n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'max_depth' )                                                                                                      \n",
    "pyplot.ylabel( 'Log Loss' )\n",
    "pyplot.savefig('max_depth_vs_min_child_weght_1.png' )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.14"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
